import sys
from utils import *
import matplotlib.pyplot as plt


capture_screen(leftup=(1191, 100),rightdown=(1638, 898))     # 截图区域

image = cv2.imread("new.jpeg")

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 红色范围
lower_red = np.array([0, 0, 200])
upper_red = np.array([179, 100, 255])

# 创建掩膜
mask = cv2.inRange(hsv, lower_red, upper_red)

# 寻找轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)


# 计算每个连通域的面积并将其存储在列表中
filtered_contours = contours_filter(contours)



recong = {
}

# 计算每个连通域的中心位置并存储在列表中
centers = []
for idx, contour in enumerate(filtered_contours):  # 目标匹配
    # 计算边界框
    x, y, w, h = cv2.boundingRect(contour)
    edge = int((w + h) / 2 * 0.25)  # 长款理论一致，这里取均值。然后使用宽的0.2作为边界

    crop_img = image[y + edge:y + h - edge, x + edge:x + w - edge]
    recong_res = match_temp(crop_img)

    recong[f'{idx}'] = {"center_x": x + w / 2,
                        "center_y": y + h / 2,
                        "digit": recong_res}

var_sorted = sorted(recong.items(), key=lambda x: (x[1]['center_y'], x[1]['center_x']))  # 有限y轴顺序，其次x轴顺序排列

mat = np.array([value[1]['digit'] for value in var_sorted])
mat = mat.reshape([16, 10])

while 1:
    max_score, best_selection, pos = find_best_selection(mat)
    if pos.__len__()==0:
        print("无结果")  # 没有可解
        sys.exit()
    # 创建一个与 arr 相同尺寸的矩阵，存储颜色值
    colors = np.ones_like(mat)

    # 仅对被选区非0值进行颜色设置
    for i in range(pos[0],pos[2]+1):
        for j in range(pos[1],pos[3]+1):
            if mat[i,j]>0:
                colors[i, j] = 0

    fig = plt.figure()

    fig.canvas.manager.window.wm_geometry('+300+300')   # 固定显示位置

    plt.imshow(colors, cmap='viridis', interpolation='nearest', alpha=0.5)

    # 在图像上添加数字标签
    for i in range(mat.shape[0]):
        for j in range(mat.shape[1]):
            if mat[i, j] > 0:
                plt.text(j, i, str(mat[i, j]), ha='center', va='center', color='black')


    # 显示坐标轴
    plt.xticks(np.arange(mat.shape[1]), fontsize=8)
    plt.yticks(np.arange(mat.shape[0]), fontsize=8)

    # 显示颜色条
    plt.colorbar()


    # 定义键盘事件的回调函数
    def on_key(event):
        if event.button==1:
            plt.close()

    # 将键盘事件的回调函数连接到图像窗口
    plt.connect('button_press_event', on_key)       # 点击画布就关闭

    # 显示图像
    plt.show()

    mat[pos[0]:pos[2] + 1, pos[1]:pos[3] + 1] = 0



